package com.newer.hospital.utils;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * 验证码生成器类，可生成数字、大写、小写字母及三者混合类型的验证码。 支持自定义验证码字符数量； 支持自定义验证码图片的大小； 支持自定义需排除的特殊字符；
 * 支持自定义干扰线的数量； 支持自定义验证码图文颜色
 *
 * @author QuanLijian
 */
public class SecurityImage {
  /**
   * 生成验证码图片
   *
   * @param securityCode 验证码字符
   * @return BufferedImage 图片
   */
  public static BufferedImage createImage(String securityCode) {
    // 验证码长度
    int codeLength = securityCode.length();
    // 字体大小
    int fSize = 15;
    int fWidth = fSize + 1;
    // 图片宽度
    int width = codeLength * fWidth + 6;
    // 图片高度
    int height = fSize * 2 + 1;
    // 图片
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics g = image.createGraphics();
    // 设置背景色
    g.setColor(Color.WHITE);
    // 填充背景
    g.fillRect(0, 0, width, height);
    // 设置边框颜色
    g.setColor(Color.LIGHT_GRAY);
    // 边框字体样式
    g.setFont(new Font("Arial", Font.BOLD, height - 2));
    // 绘制边框
    g.drawRect(0, 0, width - 1, height - 1);
    // 绘制噪点
    Random rand = new Random();
    // 设置噪点颜色
    g.setColor(Color.LIGHT_GRAY);
    for (int i = 0; i < codeLength * 6; i++) {
      int x = rand.nextInt(width);
      int y = rand.nextInt(height);
      // 绘制1*1大小的矩形
      g.drawRect(x, y, 1, 1);
    }
    // 绘制验证码
    int codeY = height - 10;
    // 设置字体颜色和样式
    g.setColor(new Color(19, 148, 246));
    g.setFont(new Font("Georgia", Font.BOLD, fSize));
    for (int i = 0; i < codeLength; i++) {
      g.drawString(String.valueOf(securityCode.charAt(i)), i * 16 + 5, codeY);
    }
    // 关闭资源
    g.dispose();
    return image;
  }

  /**
   * 返回验证码图片的流格式
   *
   * @param securityCode
   * @return
   */
  public static BufferedImage getImage(String securityCode) {
    return createImage(securityCode);
  }
}

